import java.awt.*;

/**
 * Classe per calcolare l'intensità  della forza prodotta dalla molla in ogni istante.
 * È possibile inoltre impostare il valore della costante elastica 
 * @author Simoncelli Davide && Beschi Jacopo
 *
 */

public class Forza implements Runnable {
	
	/**
	 * Costante per la costante elastica
	 */
	
	private final double COSTANTE_ELASTICA = 0.7;
	
	/**
	 * Costante in millisecondi per ricalcolare la foza
	 */
	
	private final int sleep = 20;
	
	/**
	 * Forza lungo l'asse x
	 */
	
	private double forzaX;
	
	/**
	 * Forza lungo l'asse y
	 */
	
	private double forzaY;
	
	/**
	 * Costante elastica
	 */
	
	private double kElastica; 
	
	/**
	 * Oggetto Punto
	 */
	
	private Punti p;
	
	/**
	 * Oggetto Pallina
	 */
	
	private Pallina pa;
	
	/**
	 * Thread della classe da avviare
	 */
	
	private Thread t;
	
	/**
	 * Colore del segmento congiungente il punto e la pallina
	 */
	
	private Color c;
	
	/**
	 * Costruttore della classe
	 * @param _pa Pallina 
	 * @param _p Punto 
	 */
	
	public Forza(Pallina _pa, Punti _p) {
		t = new Thread(this);
		pa = _pa;
		p = _p;
		c = Color.BLACK;
		kElastica= COSTANTE_ELASTICA;
	}
	
	/**
	 * Avvia il thread della classe
	 */
	
	public void run() {
		while(true) {
			try {
				t.sleep(sleep);
			}
			catch ( InterruptedException e) { System.out.println("Eccezzione: "+e); }
			forzaX = (p.getX() -pa.getX()) * kElastica;
			forzaY = (p.getY() -pa.getY()) * kElastica;
		}
	}
	
	/**
	 * Ritorna la forza lungo l'asse x
	 * @return Intensità  del vettore forza lungo l'asse x
	 */
	
	public double getX() {
		return forzaX;
	}
	
	/**
	 * Ritorna la forza lungo l'asse y
	 * @return Intensità  del vettore forza lungo l'asse y
	 */
	
	public double getY() {
		return forzaY;
	}
	
	/**
	 * Disegna la retta che congiunge la pallina e il punto
	 * @param g Oggetto Graphics sul quale disegnare
	 */
	
	public void  disegna(Graphics g) {
		g.setColor(c);
		g.drawLine((int) p.getX(), (int) p.getY(), (int) pa.getX(), (int) pa.getY());
	}
	
	/**
	 * Avvia il thread
	 */
	
	public void startThread(){
		t.start();
	}

	/**
	 * Ritorna la costante elastica
	 * @return La costante elastica
	 */
	
	public double getKElastica() {
		return kElastica;
	}

	/**
	 * Imposta il valore della costante elastica della molla
	 * @param _elastica Valore della costante elastica
	 */
	
	public void setKElastica(double _elastica) {
		kElastica = _elastica;
	}
}//Forza
